#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "voto.h"

/*Metodos para manipular a lista de candidatos*/
int isListaCandidatoVazia(ListaCandidato L) {
	return (L.Primeiro->prox == NULL);
}

void criarListaCandidato(ListaCandidato *L) {
	L->Primeiro = (PCandidato)malloc(sizeof(Candidato));
	L->Ultimo = (PCandidato)malloc(sizeof(Candidato));
	L->Primeiro->prox = NULL;
	L->Ultimo->prox = NULL;
}

void inserirPonteiroCandidato(ListaCandidato *L, PCandidato P) {
	if(isListaCandidatoVazia(*L))
		L->Primeiro->prox = P;
	else
	{
		L->Ultimo->prox->prox = P;
	}
	L->Ultimo->prox = P;
	P->prox = NULL;
}

void inserirCandidato(ListaCandidato *L,int candidato, int indice) {

	PCandidato P = (PCandidato)malloc(sizeof(Candidato));
	ItemCandidato item;
	item.candidato = candidato;
	item.indice = indice;


	P->itemCandidato = item;

	inserirPonteiroCandidato(L,P);
}

void imprimirCandidatos(ListaCandidato L) {

	PCandidato aux = L.Primeiro->prox;
	while (aux != NULL)
	{
		printf("\nCandidato %d, indice: %d", aux->itemCandidato.candidato, aux->itemCandidato.indice);
		aux = aux->prox;
	}
}

/*Metodos para manipular a lista de Votos*/
int isListaVotoVazia(ListaVoto L) {
	return (L.Primeiro->prox == NULL);
}

void criarListaVoto(ListaVoto *L) {
	L->Primeiro = (PVoto)malloc(sizeof(Voto));
	L->Ultimo = (PVoto)malloc(sizeof(Voto));
	L->Primeiro->prox = NULL;
	L->Ultimo->prox = NULL;
}

void inserirPonteiroVoto(ListaVoto *L, PVoto P) {

	if(isListaVotoVazia(*L))
		L->Primeiro->prox = P;
	else
	{
		L->Ultimo->prox->prox = P;
	}
	L->Ultimo->prox = P;
	P->prox = NULL;
}

void inserirVoto(ListaVoto *L, int votos, ListaCandidato LC) {

	PVoto P = (PVoto)malloc(sizeof(Voto));
	ItemVoto item;
	item.candidatos = LC;
	item.votos = votos;

	P->itemVoto = item;

	inserirPonteiroVoto(L,P);
}

void imprimirVotos(ListaVoto L) {

	PVoto aux = L.Primeiro->prox;
	while (aux != NULL)
	{
		printf("\nQtd votos %d ",aux->itemVoto.votos);
		imprimirCandidatos(aux->itemVoto.candidatos);
		aux = aux->prox;
	}
}

void liberaCandidato(ListaCandidato L) {

	PCandidato p = L.Primeiro->prox;
	while (p != NULL) {
		PCandidato t = p->prox;
		free(p);
		p = t;
	}
}

void liberaVoto(ListaVoto L)
{
   PVoto p = L.Primeiro->prox;
   while (p != NULL) {
      PVoto t = p->prox;
      liberaCandidato(p->itemVoto.candidatos);
      free(p);
      p = t;
   }
}
